#导入系统认证类以及认证异常
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
#需要用户的模型 和jwt的工具类
from user.models import UserModel
from utils.jwttool import tooljwt
import jwt #要用它的错误认证机制
#认证的流程
#1 获取请求头中的token
#2 判断token是否存在 如果不存在 抛出异常
#3 如果存在 解析token 如果解析失败 抛出异常  过期 也抛出异常
# 4 解析成功 获取用户id 查询用户信息

class MyAuth(BaseAuthentication):
    def authenticate(self, request):
        #获取请求头中的token
        token=request.META.get('HTTP_AUTHORIZATION',"")
        if not token:
            raise AuthenticationFailed("请先登录")
        #解析token  Bearer ussdsdsd
        tokendata=token.split(" ")[1]
        #解析
        try:
            dicdata=tooljwt.checktoken(tokendata)
            #获取用户id
            userid=dicdata.get('userid')
            info=UserModel.objects.get(id=userid)
            return (info,tokendata)#返回的必须是个元祖
        except jwt.ExpiredSignatureError:
            raise AuthenticationFailed("token过期")
        except jwt.InvalidTokenError:
            raise AuthenticationFailed("token无效")